package 队列;

import java.util.Scanner;

public class 单向队列 {
	
	//单向队列的指针只能向上增加，造成同时满足队满(front==rear)，队空(rear==maxSize-1)
	//修改代码，使得 指针在到达 队尾 时能够回到 队头
	public static void main(String[] args) {
		//创建一个队列
		ArrayQueue queue = new ArrayQueue(5);
		//循环菜单
		boolean loop = true;
		//记录输入
		char key = ' ';
		Scanner scanner = new Scanner(System.in);
		while(loop) {
			System.out.println("s 显示队列");
			System.out.println("a 添加数据");
			System.out.println("g 取出数据");
			System.out.println("h 头部数据");
			System.out.println("e 退出");
			//获取输入
			key = scanner.next().charAt(0);
			switch (key) {
			case 's':
				queue.showQueue();
				break;
			case 'a':
				System.out.println("输入一个数：");
				int value = scanner.nextInt();
				queue.addQueue(value);
				break;
			case 'g':
				try {
					int res = queue.getQueue();
					System.out.println(res);
				} catch (Exception e) {
					System.out.println(e.getMessage());
				}
				break;
			case 'h':
				try {
					queue.showHead();
				} catch (Exception e) {
					System.out.println(e.getMessage());
				}
				break;
			case 'e':
				loop = false;
				break;
			default:
				System.out.println("错误！");
				break;
			}
		}
		System.out.println("程序退出！");
		
	}
}

/*
 * 使用数组模拟，创建一个类ArrayQueue
 */
class ArrayQueue{
	private int maxSize;	//队列最大长度
	private int front;		//队列头
	private int rear;		//队列尾
	private int[] arr;		//队列
	
	public ArrayQueue() {
	}
	
	//构造器初始化队列
	public ArrayQueue(int maxSize) {
		this.maxSize = maxSize;
		//初始化队列
		arr = new int[maxSize];
		//初始化头指针，指向头部，front是指向头的前一个位置
		front = -1;
		//初始化尾指针，指向尾部，rear指向队尾数据，队列最后一个数据
		rear = -1;
	}
	
	//判断队满
	public boolean isFull() {
		//队尾等于最大长度减一(下标问题)
		return rear == maxSize-1;
	}
	
	//判断队空
	public boolean isEmpty() {
		//头等于尾
		return rear == front;
	}
	
	//入队
	public void addQueue(int n) {
		//判断队满
		if(isFull()) {
			System.err.println("队满，无法插入！");
			return;
		}
		//插入要在队尾操作
		//队尾后移
		rear++;
		arr[rear] = n;
	}
	
	//出队
	public int getQueue() {
		//判空
		if(isEmpty()) {
			throw new RuntimeException("队空，无法出队！");
		}
		//出队要在队头操作
		//队头后移
		front++;
		return arr[front];
	}
	
	//显示队列
	public void showQueue() {
		//判空
		if(isEmpty()) {
			System.out.println("队空，没有数据！");
		}
		for(int i = 0; i < arr.length ; i++ ) {
			System.out.println("["+i+"]"+":"+ arr[i]);
		}
	}
	
	//显示头部数据
	public void  showHead() {
		//判空
		if(isEmpty()) {
			System.out.println("队空，没有数据！");
			return;
		}
		//注意front指向，指向 队头 的前一个数据
		System.out.println("队头数据："+arr[front+1]);
	}
}